#ifndef TABLESYMBOLES_H_
#define TABLESYMBOLES_H_

#include "SymboleValue.h"
#include <vector>
#include <iostream>
using namespace std;

/*! \file TableSymboles.h
    \brief La spécification de la classe TableSymboles
    
    Décrit la liste des méthodes et attributs associés à la classe TableSymboles
    \author lazzamar
    \date 16/12/2012
 */
/*! \class TableSymboles
    \brief La classe représentant la table des symboles.
    
    Cette classe permet de construire la table contenant tout les symboles
 * valués.
 La méthode suivante est utilisée pour ajouter un symbole à la table.
    \li chercheAjoute
*/

class TableSymboles {
public:
	/*! \fn TableSymboles();
		\brief Constructeur de la classe TableSymboles.

	 Ce constructeur construit une table vide de pointeur sur les symboles valués.
	*/
    TableSymboles(); // Construit une table vide de pointeurs sur des symboles valués
	
	/*! \fn chercheAjoute(Symbole s);
		\brief Ajoute un smbole à la table.

	 * Si le symbole existe déjà, on renvoie le pointeur sur lui, ou bien on
	 * le crée et l'ajoute d'abord.
	 * \param Symbole s - le symbole qui va être ajouté en table.
	 * \return Le pointeur sur le symbole valué ajouté.
	*/
    SymboleValue * chercheAjoute (Symbole s);
      // si s est identique à un symbole valué déjà présent dans la table,
      // on renvoie un pointeur sur ce symbole valué
      // Sinon on insère un nouveau symbole valué correspondant à s
      // et on renvoie un pointeur sur le nouveau symbole valué inséré

    friend ostream & operator << (ostream & cout, TableSymboles ts); // affiche ts sur cout

private:
	/*! \var vector<SymboleValue *> table
		\brief La table des symbole valué, triée sur la chaine.
	 */
    vector<SymboleValue *> table; // la table des symboles valués, triée sur la chaine
};

#endif /* TABLESYMBOLES_H_ */
